package com.ruoyi.common.core.config.mybatis;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.config.domain.BatisParams;
import com.ruoyi.common.core.config.mybatis.enhance.SFunction;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 根Mapper，给表Mapper继承用的，可以自定义通用方法
 * {@link BaseMapper}
 * {@link com.baomidou.mybatisplus.extension.service.IService}
 * {@link com.baomidou.mybatisplus.extension.service.impl.ServiceImpl}
 * @author Cao.Yu
 * @date 2024-07-22 14:57
 */
public interface RootMapper<T> extends BaseMapper<T> {
    /**
     * 自定义批量插入
     * 如果要自动填充，@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
     */
    int insertBatch(@Param("list") List<T> list);

    /**
     * 自定义批量更新，条件为主键
     * 如果要自动填充，@Param(xx) xx参数名必须是 list/collection/array 3个的其中之一
     */
    int updateBatch(@Param("list") List<T> list);

    /**
     * 通过指定字段删除数据
     * @return
     */
    int deleteByField(BatisParams batisParam);

    /**
     * 方法名: deleteByField <br/>
     * 描述: 通过字段键值删除数据 <br/>
     * @param func  ::方法引用
     * 作者: Cao.Yu <br/>
     * 日期: Created in 2023/6/12 2:10 下午
     */
    default <R> int deleteByField(SFunction<T, R> func, String fieldValue) {
        return deleteByField(BatisParams.lambdaBuild(func, fieldValue));
    }

    /**
     * 通过指定字段查询表数据
     * @return
     */
    List<T> selectByField(BatisParams batisParam);

    /**
     * 方法名: selectByField <br/>
     * 描述: 通过字段键值查询数据 <br/>
     * @param func  ::方法引用
     * 作者: Cao.Yu <br/>
     * 日期: Created in 2023/6/12 2:26 下午
     */
    default <R> List<T> selectByField(SFunction<T, R> func, String fieldValue) {
        return selectByField(BatisParams.lambdaBuild(func, fieldValue));
    }
}
